package front.end.subestacao.ui;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;



import front.end.subestacao.itens.Componente;
import front.end.subestacao.nucleo.ModSubEstFacade;

public class FrontEndSubTree {
	
	private static final String BIBLIOTECA_COMPONENTES = "Biblioteca de Componentes";
	
	private ModSubEstFacade modSubEstacao;//ver como recuperar o path.

    private TransferableTreeNode treeNodeMutableBiblioteca;
	
	public FrontEndSubTree(ModSubEstFacade modSubEstacao) {
		this.modSubEstacao = modSubEstacao;
        geraBibliotecaTreeNode();
	}

    public TransferableTreeNode getTreeNodeMutableBiblioteca(){
        return this.treeNodeMutableBiblioteca;
    }

    private void geraBibliotecaTreeNode(){
       treeNodeMutableBiblioteca = montaTree(montaHieraquia());
    }
	
	private Map<String, List<Map<String, List<Componente>>>> montaHieraquia() {
		Map<String, List<Map<String, List<Componente>>>> hierarquia = new HashMap<String, List<Map<String, List<Componente>>>>();
		
		List<Componente> biblioteca = modSubEstacao.getBiblioteca();
		
		for (Componente componente : biblioteca) {
			String grupo = componente.getGrupo();
			String nomeSubGrupo = componente.getSubgrupo();
			
			if (hierarquia.containsKey(grupo)) {
				List<Map<String, List<Componente>>> lstNivel2 = hierarquia.get(grupo);
				if (contem(lstNivel2,nomeSubGrupo)) {
					Map<String, List<Componente>> mapSubGrupos = getMap(lstNivel2,nomeSubGrupo);
					List<Componente> lstNivel3 = mapSubGrupos.get(nomeSubGrupo);
					lstNivel3.add(componente);
					mapSubGrupos.put(nomeSubGrupo, lstNivel3);
				}
				else {
					Map<String, List<Componente>> mapSubGrupos = new HashMap<String, List<Componente>>();
					List<Componente> lstNivel3 = new ArrayList<Componente>();
					lstNivel3.add(componente);
					mapSubGrupos.put(nomeSubGrupo, lstNivel3);
					lstNivel2.add(mapSubGrupos);
					hierarquia.put(grupo, lstNivel2);
				}
				
			}
			else {
				List<Map<String, List<Componente>>> lstNivel2 = new ArrayList<Map<String,List<Componente>>>();
				Map<String, List<Componente>> mapSubGrupos = new HashMap<String, List<Componente>>();
				List<Componente> lstNivel3 = new ArrayList<Componente>();
				lstNivel3.add(componente);
				mapSubGrupos.put(nomeSubGrupo, lstNivel3);
				lstNivel2.add(mapSubGrupos);
				hierarquia.put(grupo, lstNivel2);
			}
		}
		
		return hierarquia;
	}
	
	private boolean contem(List<Map<String, List<Componente>>> lst, String nome) {
		for (Map<String, List<Componente>> map : lst) {
			if (map.containsKey(nome))
				return true;
		}
		return false;
	}

	/**
	 * Retorna o mapa correspondente ao nome do grupo.
	 * @param nomeSubGrupo
	 * @return
	 */
	private Map<String, List<Componente>> getMap(List<Map<String, List<Componente>>> lista,
		String nomeSubGrupo) 
	{
		for (Map<String, List<Componente>> map : lista) {
			if (map.containsKey(nomeSubGrupo)) {
				return map;
			}
		}
		return null;
	}


	private TransferableTreeNode montaTree(Map<String, List<Map<String, List<Componente>>>> hierarquia) {
		TransferableTreeNode node =   new TransferableTreeNode (BIBLIOTECA_COMPONENTES);
		
		
		Set<String> setGrupos = hierarquia.keySet();
		
		for (String grupo : setGrupos) {
			List<Map<String, List<Componente>>> lstSubGrupos = hierarquia.get(grupo);
			TransferableTreeNode nivel1 =   new TransferableTreeNode(grupo);
			node.add(nivel1);
			for (Map<String, List<Componente>> map : lstSubGrupos) {
				Set<String> setSubGrupos = map.keySet();
				for (String subGrupo : setSubGrupos) {
					if (subGrupo == null) {
						List<Componente> lstComponentes = map.get(subGrupo);
						for (Componente componente : lstComponentes) {
							TransferableTreeNode nivel3 =   new TransferableTreeNode(componente);
							nivel1.add(nivel3);
						}
					}
					else {
						TransferableTreeNode nivel2 =   new TransferableTreeNode(subGrupo);
						nivel1.add(nivel2);
						List<Componente> lstNomes = map.get(subGrupo);
						for (Componente componente : lstNomes) {
							TransferableTreeNode nivel3 =   new TransferableTreeNode(componente);
							nivel2.add(nivel3);
						}
					}
					
				}
			}
		}
		
	    return node;
	}
	
	
	

}
